/*
 * *说明：不可以获取java的session
 * 语法：
 添加数据
 $.session.set('key', 'value')

 删除数据
 $.session.remove('key');

 获取数据
 $.session.get('key');

 清除数据
 $.session.clear();
 */

(function ($) {
    $.session = {
        _id: null, _cookieCache: undefined, _init: function () {
            if (!window.name) {
                window.name = Math.random();
            }
            this._id = window.name;
            this._initCache();
            var matches = (new RegExp(this._generatePrefix() + "=([^;]+);")).exec(document.cookie);
            if (matches && document.location.protocol !== matches[1]) {
                this._clearSession();
                for (var key in this._cookieCache) {
                    try {
                        window.sessionStorage.setItem(key, this._cookieCache[key]);
                    } catch (e) {
                    }
                    ;
                }
            }
            document.cookie = this._generatePrefix() + "=" + document.location.protocol + ';path=/;expires=' + (new Date((new Date).getTime() + 120000)).toUTCString();
        }, _generatePrefix: function () {
            return '__session:' + this._id + ':';
        }, _initCache: function () {
            var cookies = document.cookie.split(';');
            this._cookieCache = {};
            for (var i in cookies) {
                if (typeof (cookies[i]) == "String") {
                    var kv = cookies[i].split('=');
                    if ((new RegExp(this._generatePrefix() + '.+')).test(kv[0]) && kv[1]) {
                        this._cookieCache[kv[0].split(':', 3)[2]] = kv[1];
                    }
                }
            }
        }, _setFallback: function (key, value, onceOnly) {
            var cookie = this._generatePrefix() + key + "=" + value + "; path=/";
            if (onceOnly) {
                cookie += "; expires=" + (new Date(Date.now() + 120000)).toUTCString();
            }
            document.cookie = cookie;
            this._cookieCache[key] = value;
            return this;
        }, _getFallback: function (key) {
            if (!this._cookieCache) {
                this._initCache();
            }
            return this._cookieCache[key];
        }, _clearFallback: function () {
            for (var i in this._cookieCache) {
                document.cookie = this._generatePrefix() + i + '=; path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
            }
            this._cookieCache = {};
        }, _deleteFallback: function (key) {
            document.cookie = this._generatePrefix() + key + '=; path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
            delete this._cookieCache[key];
        }, get: function (key) {
            return window.sessionStorage.getItem(key) || this._getFallback(key);
        }, set: function (key, value, onceOnly) {
            try {
                window.sessionStorage.setItem(key, value);
            } catch (e) {
            }
            this._setFallback(key, value, onceOnly || false);
            return this;
        }, 'delete': function (key) {
            return this.remove(key);
        }, remove: function (key) {
            try {
                window.sessionStorage.removeItem(key);
            } catch (e) {
            }
            ;
            this._deleteFallback(key);
            return this;
        }, _clearSession: function () {
            try {
                window.sessionStorage.clear();
            } catch (e) {
                for (var i in window.sessionStorage) {
                    window.sessionStorage.removeItem(i);
                }
            }
        }, clear: function () {
            this._clearSession();
            this._clearFallback();
            return this;
        }
    };
    $.session._init();
})(jQuery);